package com.gzist.zzchatroomserver.config;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.gzist.zzchatroomserver.common.base.BaseDO;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * <p>
 * MyBatis-Plus代码生成器
 *
 * @author hzj
 */
public class CodeGenerator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 获取作者名称
        System.out.print("请输入作者名称：");
        String author = scanner.nextLine();

        // 获取包名
        System.out.print("请输入包名：");
        String packageName = scanner.nextLine();

        // 获取需要生成的表名
        System.out.print("请输入需要生成的表名（多个表名用英文逗号分隔）：");
        String tables = scanner.nextLine();
        List<String> tableList = Arrays.asList(tables.split(","));

        // 获取过滤表前缀
        System.out.print("请输入过滤表前缀（输入 null 或留空则不设置）：");
        String tablePrefix = scanner.nextLine().trim();
        if (tablePrefix.equalsIgnoreCase("null") || tablePrefix.isEmpty()) {
            tablePrefix = null;
        }


        String finalTablePrefix = tablePrefix;
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/zz_chatroom?serverTimezone=Asia/Shanghai", "root", "123456")

                // 全局配置
                .globalConfig((scannerInput, builder) -> {
                    builder.author(author) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(System.getProperty("user.dir") + "/src/main/java")
                            .commentDate("yyyy-MM-dd")
                            .disableOpenDir(); // 禁止打开文件目录，默认false
                })

                // 包配置
                .packageConfig((scannerInput, builder) -> {
                    builder.parent(packageName)
                            .moduleName(null)
                            .entity("entity.po")
                            .service("service")
                            .serviceImpl("service.impl")
                            .mapper("mapper")
                            .xml("mapper.xml")
                            .controller("controller")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper"));
                })

                // 策略配置
                .strategyConfig((scannerInput, builder) -> builder
                        .addInclude(tableList.toArray(new String[0])) // 设置需要生成的表名
                        .addTablePrefix(finalTablePrefix != null ? finalTablePrefix : "") // 设置过滤表前缀

                        // 实体配置
                        .entityBuilder()
                        .superClass(BaseDO.class) // 设置实体类父类-父类中存在的字段不会在实体类中存在
                        .enableLombok()
                        .naming(NamingStrategy.underline_to_camel)// 数据表映射实体命名策略：默认下划线转驼峰underline_to_camel
                        .columnNaming(NamingStrategy.underline_to_camel)// 表字段映射实体属性命名规则：默认null，不指定按照naming执行
                        .idType(IdType.ASSIGN_ID)// 添加全局主键类型
                        .formatFileName("%s")// 格式化实体名称，%s取消首字母I,

                        // mapper配置
                        .mapperBuilder()
                        //.enableMapperAnnotation()// 开启mapper注解
                        .enableBaseResultMap()// 启用xml文件中的BaseResultMap 生成
                        .enableBaseColumnList()// 启用xml文件中的BaseColumnList
                        .formatMapperFileName("%sMapper")// 格式化Mapper类名称
                        .formatXmlFileName("%sMapper")// 格式化xml文件名称

                        // service配置
                        .serviceBuilder()
                        .formatServiceFileName("%sService")// 格式化 service 接口文件名称
                        .formatServiceImplFileName("%sServiceImpl")// 格式化 service 接口文件名称
                        .controllerBuilder()
                        .enableRestStyle()
                )

                // 使用Velocity引擎模板
                .templateEngine(new VelocityTemplateEngine())

                // 配置模板文件
                .templateConfig(builder -> builder
                        .entity("/templates/entity.java.vm")
                        .service("/templates/service.java.vm")
                        .serviceImpl("/templates/serviceImpl.java.vm")
                        .mapper("/templates/mapper.java.vm")
                        .xml("/templates/mapper.xml.vm")
                        .controller("/templates/controller.java.vm")
                        .build())

                .execute();
    }
}
